■ 產⽣器表示式
[n ** 2 for n in range(12)] #典型的列表推導
(n ** 2 for n in range(12)) #典型的產生器表示式
list[(n ** 2 for n in range(12))]
L = [n ** 2 for n in range(12)] #列表推導
for val in L:
print(val, end=' ')
G = (n ** 2 for n in range(12)) #產生器表示式
for val in G:
print(val, end=' ')
# 區別是:產生器表達式並不會在數值被需要之前計算出它們。這並不僅僅可以提高記憶體效率,
也能提高計算效率!這也意味著⼀個列表的大小受到可用記憶體的限制,而產生器表達式的大小是無限的!
itertools import count
count()
for i in count():
print(i, end=' ')
if i >= 10: break
factors = [2, 3, 5, 7]
G = (i for i in count() if all(i % n > 0 for n in factors))
for val in G:
print(val, end=' ')
if val > 40: break
L = [n ** 2 for n in range(12)]
for val in L:
print(val, end=' ')
print()
for val in L:
print(val, end=' ')
#另⼀方面,產⽣器表示式在⼀次迭代後就被用盡
G = (n ** 2 for n in range(12))
list(G)
list(G)
#這個特性可以變得非常實用,因為這意味著迭代可以被停止和繼續
G = (n**2 for n in range(12))
for n in G:
print(n, end=' ')
if n > 30: break
print("\ndoing something in between")
for n in G:
print(n, end=' ')
#這個特性在對硬碟上的資料檔案集合進行處理時非常實用,意味著我們可以非常輕鬆地批量處理資料,
讓產生器負責追蹤那些你尚未處理的區塊。
■ 產⽣器函式:關鍵字yield
L1 = [n ** 2 for n in range(12)]
L2 = []
for n in range(12):
L2.append(n ** 2)
print(L1)
print(L2)
#同樣地,我們也有兩種方式組等價的產生器:
G1 = (n ** 2 for n in range(12))
def gen():
for n in range(12):
yield n ** 2
G2 = gen()
print(*G1)
print(*G2)
■ case:質數產生器
L = [n for n in range(2, 40)]
print(L)
L = [n for n in L if n == L[0] or n % L[0] > 0]
print(L)
L = [n for n in L if n == L[1] or n % L[1] > 0]
print(L)
L = [n for n in L if n == L[2] or n % L[2] > 0]
print(L)
def gen_primes(N):
"""Generate primes up to N"""
primes = set()
for n in range(2, N):
if all(n % p > 0 for p in primes):
primes.add(n)
yield n
print(*gen_primes(100))
■ Refer to《Python 旋風之旅,[正體中文]Will保哥》的第13章
文章怎麼一堆奇怪的符號啊?
Homura您好,感謝提醒,有些字的字型不符合,已經修正囉!若有問題歡迎再跟我說,感謝您的熱心